home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / Bill's Win32Asm Page / vga1.txt < prev   
Text File  |  2000-05-25  |  6KB  |  168 lines

  1. VGA Programming in Mode 13h
  2. -----------------------------------------------------------------------------
  3.  
  4. This article will describe how to program VGA graphics Mode 13h using
  5. assembly language.  Mode 13h is the 320x200x256 graphics mode, and is fast
  6. and very convenient from a programmers perspective.
  7.  
  8. The video buffer begins at address A000:0000 and ends at address A000:F9FF.
  9. This means the buffer is 64000 bytes long and that each pixel in mode 13h
  10. is represented by one byte.
  11.  
  12. It is easy to set up mode 13h and the video buffer in assembly language:
  13.  
  14.         mov     ax,0013h        ; Int 10 - Video BIOS Services
  15.         int     10h             ; ah = 00 - Set Video Mode
  16.                                 ; al = 13 - Mode 13h (320x200x256)
  17.  
  18.         mov     ax,0A000h       ; point segment register es to A000h
  19.         mov     es,ax           ; we can now access the video buffer as
  20.                                 ; offsets from register es
  21.  
  22. At the end of your program, you will probably want to restore the text
  23. mode.  Here's how:
  24.  
  25.         mov     ax,0003h        ; Int 10 - Video BIOS Services
  26.         int     10h             ; ah = 00 - Set Video Mode
  27.                                 ; al = 03 - Mode 03h (80x25x16 text)
  28.  
  29. Accessing a specific pixel int the buffewr is also very easy:
  30.  
  31.                                 ; bx = x coordinate
  32.                                 ; ax = y coordinate
  33.         imul    ax, 320         ; multiply y coord by 320 to get row
  34.         add     bx,ax           ; add this with the x coord to get offset
  35.         mov     cx,es:[bx]      ; now pixel x,y can be accessed as es:[bx]
  36.  
  37. Hmm... That was easy, but that multiplication is slow and we should get
  38. rid of it.  Thats easy to do too, simply by using bit shifting instead of
  39. multiplication. Shifting a number to the left is the same as multiplying
  40. by 2.  We want to multiply by 320, which is not a multiple of 2, but
  41. 320 = 256 + 64, and 256 and 64 are both even multiples of 2.  So a faster
  42. way to access a pixel is:
  43.  
  44.                                 ; bx = x coordinate
  45.                                 ; ax = y coordinate
  46.         mov     cx,bx           ; copy bx to cx, to save it temporatily
  47.         shl     cx,8            ; shift left by 8, which is the same as
  48.                                 ; multiplying by 2^8 = 256
  49.         shl     bx,6            ; now shift left by 6, which is the same as
  50.                                 ; multiplying by 2^6 = 64
  51.         add     bx,cx           ; now add those two together, whis is
  52.                                 ; effectively multiplying by 320
  53.         add     bx,ax           ; finally add the x coord to this value
  54.         mov     cx,es:[bx]      ; now pixel x,y can be accessed as es:[bx]
  55.  
  56. Well, the code is a little bit longer and looks more complicated, but I
  57. can guarantee its much faster.
  58.  
  59. To plot colors, we use a color look-up table.  This look-up table is a
  60. 768 (3x256) array.  Each index of the table is really the offset index*3.
  61. The 3 bytes at each index hold the corresponding values (0-63) of the red,
  62. green, and blue components.  This gives a total of 262144 total possible
  63. colors.  However, since the table is only 256 elements big, only 256
  64. different colors are possible at a given time.
  65.  
  66. Changing the color palette is accomplished through the use of the I/O
  67. ports of the VGA card:
  68.  
  69.         Port 03C7h is the Palette Register Read port.
  70.         Port 03C8h is the Palette Register Write port
  71.         Port 03C9h is the Palette Data port
  72.  
  73. Here is how to change the color palette:
  74.  
  75.                                 ; ax = palette index
  76.                                 ; bl = red component (0-63)
  77.                                 ; cl = green component (0-63)
  78.                                 ; dl = blue component (0-63)
  79.  
  80.         mov     dx,03C8h        ; 03c8h = Palette Register Write port
  81.         out     dx,ax           ; choose index
  82.  
  83.         mov     dx,03C9h        ; 03c8h = Palette Data port
  84.         out     dx,al
  85.         mov     bl,al           ; set red value
  86.         out     dx,al
  87.         mov     cl,al           ; set green value
  88.         out     dx,al
  89.         mov     dl,al           ; set blue value
  90.  
  91. Thats all there is to it.  Reading the color palette is similar:
  92.  
  93.                                 ; ax = palette index
  94.                                 ; bl = red component (0-63)
  95.                                 ; cl = green component (0-63)
  96.                                 ; dl = blue component (0-63)
  97.  
  98.         mov     dx,03C7h        ; 03c7h = Palette Register Read port
  99.         out     dx,ax           ; choose index
  100.  
  101.         mov     dx,03C9h        ; 03c8h = Palette Data port
  102.         in      al,dx
  103.         mov     bl,al           ; get red value
  104.         in      al,dx
  105.         mov     cl,al           ; get green value
  106.         in      al,dx
  107.         mov     dl,al           ; get blue value
  108.  
  109. Now all we need to know is how to plot a pixel of a certain color at a
  110. certain location.  Its very easy, given what we already know:
  111.  
  112.                                 ; bx = x coordinate
  113.                                 ; ax = y coordinate
  114.                                 ; dx = color (0-255)
  115.         mov     cx,bx           ; copy bx to cx, to save it temporatily
  116.         shl     cx,8            ; shift left by 8, which is the same as
  117.                                 ; multiplying by 2^8 = 256
  118.         shl     bx,6            ; now shift left by 6, which is the same as
  119.                                 ; multiplying by 2^6 = 64
  120.         add     bx,cx           ; now add those two together, whis is
  121.                                 ; effectively multiplying by 320
  122.         add     bx,ax           ; finally add the x coord to this value
  123.         mov     es:[bx],dx      ; copy color dx into memory location
  124.                                 ; thats all there is to it
  125.  
  126. Ok, we now know how to set up Mode 13h, set up the video buffer, plot a
  127. pixel, and edit the color palette.
  128.  
  129. My next article will go on to show how to draw lines, utilize the vertical
  130. retrace for smoother rendering, and anything else i can figure out by
  131. that time...
  132.  
  133. -----------------------------------------------------------------------------
  134.  
  135. Copyright (C) 1998
  136. Bill T.  (billasm@usa.net)
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166.  
  167.  
  168.